PHP Coding Conventions 
========== ========== ========== ========== ==========
PHP Closing Tag
- Không đóng tag ?>, mà thay vào đó là comment
 
<?php 
echo "Here's my code!"; 
/* End of file myfile.php */ 
/* Location: ./system/modules/mymodule/myfile.php */
========== ========== ========== ========== ==========
Whitespace in Files
- Không để khoảng trắng trước thẻ mở của php (<?php )
========== ========== ========== ========== ==========
Indentation
- Sử dụng 4 spaces. Ko sử dụng tab (space giống nhau ở mọi nơi, tab thì không)
========== ========== ========== ========== ==========
Maximum Line Length
- Trên một dòng mã nên dưới 80 ký tự. Tối đa nên dưới 120 ký tự 
========== ========== ========== ========== ==========
. Strings
- Luôn sử dụng dấu nháy đơn thay vì nháy kép để bao chuỗi trừ các TH đặc biệt

INCORRECT:
"My String" // no variable parsing, so no use for double quotes 
"My string $foo" // needs braces 
'SELECT foo FROM bar WHERE baz = \'bag\'' // ugly
CORRECT: 
'My String' 
"My string {$foo}" 
"SELECT foo FROM bar WHERE baz = 'bag'"
========== ========== ========== ========== ==========
. SQL Queries
- Luôn viết hoa các từ khóa của MySql
========== ========== ========== ========== ==========
. String Concatenation
- Chuỗi nối bởi các dấu chấm luôn kèm khoảng cách hai bên để tăng khả năng dễ đọc
- Chuỗi kết nối dài nên được xuống dòng hợp lý
$company = 'PHP' . ' ' . 'Technologies';
$sql = "SELECT `id`, `name` FROM `people` "
	 . "WHERE `name` = 'Susan' "
	 . "ORDER BY `name` ASC ";
========== ========== ========== ========== ==========
. Arrays
$sampleArray = array(
	1, 2, 3, 'Zend', 'Studio',
	$a, $b, $c,
	56.44, $d, 500,
);
$sampleArray = array(
	'firstKey'  => 'firstValue',
	'secondKey' => 'secondValue',
);
========== ========== ========== ========== ==========
. Variable Names
ten_bien
========== ========== ========== ========== ==========
. Method Naming
function ten_phuong_thuc
========== ========== ========== ========== ==========
. Commenting

/** 
 * Encodes string for use in XML 
 * 
 * @param string $str
 * @param array $data
 * @return string 
 */ 
function xmlEncode($str, $data)
========== ========== ========== ========== ==========
. Constants
- Viết hoa tất cả các chữ
- Các từ phân cách nhau bằng dấu gạch dưới
MY_CONSTANT
========== ========== ========== ========== ==========
. One File per Class
- Một file chỉ chứa 1 lớp duy nhất
========== ========== ========== ========== ==========
Private Methods and Variables
- Phương thức hoặc biến là private cần để một dấu gạch dưới phía trước nó

convert_text() // public method 
_convert_text() // private method
========== ========== ========== ========== ==========
. TRUE, FALSE, NULL
- Viết hoa tất cả các chữ
========== ========== ========== ========== ==========
. Spacing
- Không để khoảng trắng xung quanh dấu ngoặc đơn của hàm
- Với các câu lệch điều khiển, đặt một space trước dấu ngoặc '(' và sau dấu ngoặc ')'

INCORRECT: 
function foo ( $bar ) 
CORRECT: 
function foo($bar)

INCORRECT: 
foreach( $query->result() as $row ){}
CORRECT: 
foreach ($query->result() as $row) {}
========== ========== ========== ========== ==========
. Default Function Arguments
- Bất cứ khi nào có thể, nên cung cấp một giá trị mặc định cho tham số

function foo($bar = '', $baz = FALSE)
========== ========== ========== ========== ==========
. If/Else/Elseif

if (($a == $b)
	&& ($b == $c)
	|| (Foo::CONST == $d)
) {
	$a = $d;
}
========== ========== ========== ========== ==========
. Tên file
- Viết thường tất cả các chữ
- Các từ phân cách nhau bằng dấu gạch dưới
========== ========== ========== ========== ==========
. Tên model
- Thêm hậu tố model
Example: resume_model.php
========== ========== ========== ========== ==========
. Class Naming
- Viết hoa chữ cái đầu tiên
- Các từ phân cách nhau bằng dấu gạch dưới
class Super_class {}
========== ========== ========== ========== ==========
If (not) empty
/* Not recommended */
if ($var == '')
/* Recommended */
if (empty($var))
========== ========== ========== ========== ==========
Loop conditions
/* Not recommended - condition will be calculated for each loop iteration */
for ($i = 0; $i < strlen($string); $i++) {
	// do something 
}
/* Recommended */
$l = strlen($string); 
for ($i = 0; $i < $l; $i++) { 
	// do something 
}
========== ========== ========== ========== ==========
Luôn ép kiểu int cho tham số nhận được nếu nó là kiểu int
function getUserById($id) {
	$id = (int) $id;
}
========== ========== ========== ========== ==========
Avoid writing naive setters and getters
class dog {
  public $name = '';

  public function setName($name) {
    $this->name = $name;
  }

  public function getName() {
    return $this->name;
  }
}
========== ========== ========== ========== ==========
Dont copy variables for no reason
$description = strip_tags($_POST['description']);
echo $description;
========== ========== ========== ========== ==========
Avoid doing SQL queries within a loop
foreach ($userList as $user) {
  $query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
  mysql_query($query);
}
INSERT INTO users (first_name,last_name) VALUES("John", "Doe")

$userData = array();
foreach ($userList as $user) {
    $userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
 }
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
========== ========== ========== ========== ==========


